/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.mwmd.aem.search.example.impl.servlet; import com.mwmd.aem.search.example.IndexFields; import java.io.IOException; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.sling.SlingServlet; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.apache.sling.commons.json.io.JSONWriter; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.FacetField; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; /** * * @author Matthias Wermund */ @Properties({ @Property(name = "url", label = "Solr URL", description = "Address of Apache Solr instance") }) @SlingServlet(paths = "/bin/ease-example/query", metatype = true) public class QueryServlet extends SlingSafeMethodsServlet { private String url; @Activate protected void activate(Map<String, Object> properties) { this.url = (String) properties.get("url"); } @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { String q = request.getParameter("q"); if (q == null || q.trim().length() == 0) { q = "*:*"; } try { SolrQuery query = new SolrQuery(q); query.addFacetField(IndexFields.LANGUAGE, IndexFields.TAGS); query.setFacetMinCount(1); query.setRows(Integer.MAX_VALUE); query.setFields(IndexFields.PATH, IndexFields.TITLE, "score"); long time = System.currentTimeMillis(); QueryResponse result = new HttpSolrServer(url).query(query); time = System.currentTimeMillis() - time; response.setCharacterEncoding("UTF-8"); response.setContentType("application/json"); JSONWriter json = new JSONWriter(response.getWriter()); json.object(); json.key("time").value(time); json.key("total").value(result.getResults().getNumFound()); json.key("facets").object(); for (FacetField facet : result.getFacetFields()) { if (facet.getValueCount() > 0) { json.key(facet.getName()).array(); for (FacetField.Count value : facet.getValues()) { json.object(); json.key("value").value(value.getName()); json.key("count").value(value.getCount()); json.endObject(); } json.endArray(); } } json.endObject(); json.key("items").array(); for (SolrDocument doc : result.getResults()) { json.object(); json.key("path").value(doc.getFieldValue(IndexFields.PATH)); json.key("title"); Object titleValues = doc.getFieldValue(IndexFields.TITLE); String title = null; if (titleValues instanceof List) { title = ((List) titleValues).get(0).toString(); } else if (titleValues != null) { title = titleValues.toString(); } json.value(title != null && !title.isEmpty() ? title : doc.getFieldValue(IndexFields.PATH)); json.key("score").value(doc.getFieldValue("score")); json.endObject(); } json.endArray(); json.endObject(); } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().print(e.getMessage()); } } }